//1.位运算 - 两整数之和
//^ 的本质是无进位相加
//如何得到进位?? 直接按位与即可
//然后重复上述操作, 直到进位变成0, 那么 a中存储的就是最终结果
class Solution {
public:
    int getSum(int a, int b) {
        while(b)
        {
            int x = a ^ b;
            int y = (a & b) << 1;
            a = x;
            b = y;
        }
        return a;
    }
};

//2.位运算 - 只出现一次的数字II
//思路:对于每一个比特位, 将所有数的这一位相加, 然后 %3, 得到的数就是只出现1此的数的那一位
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        for(int i = 0; i < 32; i++)
        {
            int sum = 0;
            for(auto x : nums)
            {
                sum += ((x >> i) & 1);
            }
            sum %= 3;
            ret |= (sum << i);
        }
        return ret;
    }
};